//
// Created by Administrator on 2022/1/10.
// 常见的指针使用错误
// 1.忘记在使用完毕之后释放内存
// 2.使用了已经释放的内存
// 3.使用了超过边界的内存
// 4.改变内存的指针，导致
// 动态内存使用建议
// 1.避免修改指向已分配的内存的指针
// 2.对于已经free之后的指针主动置为NULL
// 3.避免将过多的指针指向动态分配的内存
// 4.动态内存遵从谁分配谁释放的原则
//

#include <stdio.h>
#include <stdlib.h>

#define PLAYER_COUNT 10

//使用指针的指针来做修改
//void InitPointer(int *ptr,int length,int default_value){
void InitPointer(int **ptr, int length, int default_value) {
    *ptr = malloc(sizeof(int) * length);
    for (int i = 0; i < length; ++i) {
        (*ptr)[i] = default_value;
    }
}

int main() {
    //malloc()分配的内存在堆区
//    int *plays = malloc(sizeof(int) * PLAYER_COUNT);
    int *plays;
    //报错：传递指针变量，指针变量本身是被赋值的，在InitPointer的ptr和plays是两个不同的变量，函数执行完毕后ptr销毁，因此在InitPointer给plays赋值是无效的
//    InitPointer(&plays, PLAYER_COUNT, 0);
    //分配内存的第二种方式,calloc(长度,大小),会对内存进行清空
    plays = calloc(PLAYER_COUNT, sizeof(int));
    for (int i = 0; i < PLAYER_COUNT; ++i) {
        printf("%d,", plays[i]);
    }

    //重新分配内存
    plays = realloc(plays, sizeof(int) * 2 * PLAYER_COUNT);
    for (int i = 0; i < PLAYER_COUNT * 2; ++i) {
        printf("%d,", plays[i]);
    }
    //释放内存
    free(plays);
    return 0;
}